package org.springblade.resource.oss.type;

import cn.hutool.core.collection.CollUtil;
import cn.hutool.core.io.FileTypeUtil;
import lombok.AllArgsConstructor;
import lombok.Getter;

import java.io.File;
import java.io.FileInputStream;
import java.io.FileNotFoundException;
import java.io.InputStream;
import java.util.Arrays;
import java.util.List;


/**
 * 文件类型枚举
 * <p>
 * 该类是针对
 * {@link FileTypeUtil#FILE_TYPE_MAP}
 * 支持的类型进行的简单的特殊的分类，后续可继续往下添加支持的内容
 * </p>
 * <p>
 * suffixes 字段可能为空，其他的没有被检索的类型都会被归类到 {@link FileType#OTHER} 中
 * suffixes 字段中包含了 {@link FileTypeUtil#FILE_TYPE_MAP} 不支持的类型，并不影响判断，后续可继续扩展其他类型
 */
@AllArgsConstructor
@Getter
public enum FileType {

	VIDEO("1", Arrays.asList("avi", "mp4", "mpg", "mpeg", "mov", "rm", "rmvb", "wmv", "flv", "swf", "3gp", "mkv", "avi", "mp4", "mpg", "mpeg", "mov", "rm")),

	IMAGE("0", Arrays.asList("bmp", "gif", "jpg", "jpeg", "png", "tif", "tiff", "ico", "pcx", "tga", "exif", "fpx", "svg", "psd", "cdr", "pcd", "dxf", "ufo", "eps", "ai", "raw", "wmf", "webp")),

	OTHER("10000", null);;
	/**
	 * 类型名
	 */
	private String type;

	/**
	 * 类型后缀集合
	 */
	private List<String> suffixes;

	/**
	 * 从 FileTypeUtil 获取到的类型，通过包含的关系转换成本 FileType 类型
	 *
	 * @param inputStream
	 * @return
	 */
	public static FileType getFileType(InputStream inputStream) {
		String fileType = FileTypeUtil.getType(inputStream);
		return Arrays.stream(FileType.values())
			.filter(t -> CollUtil.contains(t.getSuffixes(), fileType))
			.findFirst()
			.orElse(OTHER);
	}


	/**
	 * 从 FileTypeUtil 获取到的类型，通过包含的关系转换成本 FileType 类型
	 *
	 * @param file
	 * @return
	 */
	public static FileType getFileType(File file) {
		try {
			return getFileType(new FileInputStream(file));
		} catch (FileNotFoundException e) {
			throw new RuntimeException(e);
		}
	}

}
